class Solution {
public:
    vector<int> dqMax;
    vector<int> dqMin;
    int maxh = 0, maxt = 0, minh = 0, mint = 0;
    vector<int> arr;
    int longestSubarray(vector<int>& nums, int limit) {
        int n = nums.size();
        dqMax.resize(n);
        dqMin.resize(n);
        arr = nums;
        int r = 0;
        int ans = 0;
        for(int l = 0; l < n; ++l)
        {
            while(r < n && func(arr[r], limit))
            {
                Push(r++);
            }
            ans = max(ans, r - l);
            Pop(l);
        }
        return ans;
    }

    bool func(int num, int limit)
    {
        int Max = maxh < maxt ? max(arr[dqMax[maxh]], num) : num;
        int Min = minh < mint ? min(arr[dqMin[minh]], num) : num;
        return Max - Min <= limit;
    }

    void Push(int pos)
    {
        while(maxh < maxt && arr[dqMax[maxt - 1]] <= arr[pos])
            --maxt;
        
        dqMax[maxt++] = pos;

        while(minh < mint && arr[dqMin[mint - 1]] >= arr[pos])
            --mint;
        
        dqMin[mint++] = pos;
    }

    void Pop(int pos)
    {
        if(maxh < maxt && pos == dqMax[maxh]) maxh++;
        if(minh < mint && pos == dqMin[minh]) minh++;
    }
};

